package com.wangzd.service;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem;

import java.io.File;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class AddBookmarksToPdf {


    public static void main(String[] args) {
        String inputFilePath = "C:\\Users\\wangzd\\Downloads\\知识点_compressed.pdf";
        String outputFilePath = "C:\\Users\\wangzd\\Downloads\\知识点_书签.pdf";

        try (PDDocument document = PDDocument.load(new File(inputFilePath))) {
            List<Chapter> chapters = getChapters(); // 获取带层级的目录结构
            PDOutlineItem rootOutline = buildOutlineTree(chapters, document); // 构建书签树

            // 创建 PDDocumentOutline 并添加根节点
            PDDocumentOutline documentOutline = new PDDocumentOutline();
            documentOutline.addLast(rootOutline);

            // 设置到文档中
            document.getDocumentCatalog().setDocumentOutline(documentOutline);

            document.save(outputFilePath);
            System.out.println("书签已添加并保存到：" + outputFilePath);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 定义一个类来存储章节信息及其层级
     */
    private static class Chapter {
        String title;
        int pageNumber;
        int level; // 层级：1 表示一级标题，2 表示二级标题...

        public Chapter(String title, int pageNumber, int level) {
            this.title = title;
            this.pageNumber = pageNumber;
            this.level = level;
        }
    }

    /**
     * 返回完整的章节列表，包含层级信息
     */
    private static List<Chapter> getChapters() {
        List<Chapter> chapters = new ArrayList<>();

        chapters.add(new Chapter("目录", 2, 1));

        // 一级标题：一 计算机组成与结构
        chapters.add(new Chapter("一 计算机组成与结构", 9, 1));

        // 二级标题：1 数据的表示
        chapters.add(new Chapter("1 数据的表示", 10, 2));

        // 三级标题：1.1 - 1.4
        chapters.add(new Chapter("1.1 进制的转化", 10, 3));
        chapters.add(new Chapter("1.2 数的表示", 10, 3));
        chapters.add(new Chapter("1.3 浮点数的运算", 11, 3));
        chapters.add(new Chapter("1.4 算术运算和逻辑运算", 11, 3));

        // 二级标题：2 校验码
        chapters.add(new Chapter("2 校验码", 12, 2));

        // 三级标题：2.1 - 2.3
        chapters.add(new Chapter("2.1 奇偶校验码", 12, 3));
        chapters.add(new Chapter("2.2 循环冗余校验码CRC", 12, 3));
        chapters.add(new Chapter("2.3 海明校验码", 12, 3));

        // 二级标题：3 计算机硬件和指令
        chapters.add(new Chapter("3 计算机硬件和指令", 15, 2));

        // 二级标题：4 计算机体系结构分类
        chapters.add(new Chapter("4 计算机体系结构分类", 17, 2));

        // 二级标题：5 指令系统CISC和RISC
        chapters.add(new Chapter("5 指令系统CISC和RISC", 17, 2));

        // 二级标题：6 指令的流水处理
        chapters.add(new Chapter("6 指令的流水处理", 18, 2));

        // 三级标题：6.1 - 6.2
        chapters.add(new Chapter("6.1 流水线原理", 18, 3));
        chapters.add(new Chapter("6.2 流水线时间计算", 18, 3));

        // 二级标题：7 存储系统
        chapters.add(new Chapter("7 存储系统", 19, 2));

        // 三级标题：7.1 - 7.5
        chapters.add(new Chapter("7.1 计算机存储结构层次图", 19, 3));
        chapters.add(new Chapter("7.2 局部性原理", 20, 3));
        chapters.add(new Chapter("7.3 高速缓存Cache", 20, 3));
        chapters.add(new Chapter("7.4 虚拟存储器", 21, 3));
        chapters.add(new Chapter("7.5 磁盘", 21, 3));

        // 二级标题：8 输入输出技术
        chapters.add(new Chapter("8 输入输出技术", 22, 2));

        // 二级标题：9 总线
        chapters.add(new Chapter("9 总线", 24, 2));

        // 二级标题：10 系统可靠性分析
        chapters.add(new Chapter("10 系统可靠性分析", 24, 2));

        // 一级标题：二 系统配置与性能评价
        chapters.add(new Chapter("二 系统配置与性能评价", 25, 1));

        // 二级标题：1 性能指标
        chapters.add(new Chapter("1 性能指标", 25, 2));

        // 二级标题：2 性能评价方法
        chapters.add(new Chapter("2 性能评价方法", 27, 2));

        // 二级标题：3 阿姆达尔解决方案
        chapters.add(new Chapter("3 阿姆达尔解决方案", 27, 2));

        // 一级标题：三 操作系统知识
        chapters.add(new Chapter("三 操作系统知识", 28, 1));

        // 二级标题：1 操作系统概述
        chapters.add(new Chapter("1 操作系统概述", 28, 2));

        // 二级标题：2 进程管理
        chapters.add(new Chapter("2 进程管理", 30, 2));

        // 三级标题：2.1 - 2.7
        chapters.add(new Chapter("2.1 进程的组成和状态", 30, 3));
        chapters.add(new Chapter("2.2 前趋图和进程资源图", 30, 3));
        chapters.add(new Chapter("2.3 进程间的同步与互斥", 31, 3));
        chapters.add(new Chapter("2.4 信号量操作", 32, 3));
        chapters.add(new Chapter("2.5 进程调度", 33, 3));
        chapters.add(new Chapter("2.6 死锁问题", 34, 3));
        chapters.add(new Chapter("2.7 线程", 34, 3));

        // 二级标题：3 存储管理
        chapters.add(new Chapter("3 存储管理", 35, 2));

        // 三级标题：3.1 - 3.4
        chapters.add(new Chapter("3.1 分区存储管理", 35, 3));
        chapters.add(new Chapter("3.2 分页存储管理", 36, 3));
        chapters.add(new Chapter("3.3 段式存储管理", 38, 3));
        chapters.add(new Chapter("3.4 段页式存储管理", 39, 3));

        // 二级标题：4 设备管理
        chapters.add(new Chapter("4 设备管理", 40, 2));

        // 三级标题：4.1 - 4.3
        chapters.add(new Chapter("4.1 概述", 40, 3));
        chapters.add(new Chapter("4.2 I/O软件", 40, 3));
        chapters.add(new Chapter("4.3 虚设备和SPOOLING 技术", 41, 3));

        // 二级标题：5 文件管理
        chapters.add(new Chapter("5 文件管理", 41, 2));

        // 三级标题：5.1 - 5.4
        chapters.add(new Chapter("5.1 概述", 41, 3));
        chapters.add(new Chapter("5.2 索引文件结构", 42, 3));
        chapters.add(new Chapter("5.3 文件目录", 43, 3));
        chapters.add(new Chapter("5.4 文件存储空间管理", 44, 3));

        // 一级标题：四 嵌入式技术
        chapters.add(new Chapter("四 嵌入式技术", 45, 1));

        // 二级标题：1 嵌入式微处理器
        chapters.add(new Chapter("1 嵌入式微处理器", 45, 2));

        // 三级标题：1.1 - 1.3
        chapters.add(new Chapter("1.1 嵌入式微处理器体系结构", 45, 3));
        chapters.add(new Chapter("1.2 嵌入式微处理器分类", 46, 3));
        chapters.add(new Chapter("1.3 多核处理器结构", 48, 3));

        // 二级标题：2 嵌入式软件与操作系统
        chapters.add(new Chapter("2 嵌入式软件与操作系统", 49, 2));

        // 三级标题：2.1 - 2.3
        chapters.add(new Chapter("2.1 嵌入式软件基础", 49, 3));
        chapters.add(new Chapter("2.2 嵌入式操作系统", 49, 3));
        chapters.add(new Chapter("2.3 嵌入式实时操作系统", 51, 3));

        // 二级标题：3 嵌入式软件设计
        chapters.add(new Chapter("3 嵌入式软件设计", 52, 2));

        // 三级标题：3.1 - 3.2
        chapters.add(new Chapter("3.1 开发流程", 52, 3));
        chapters.add(new Chapter("3.2 开发工具", 54, 3));

        // 一级标题：五 数据库系统
        chapters.add(new Chapter("五 数据库系统", 54, 1));

        // 二级标题：1 三级模式一两级映像象
        chapters.add(new Chapter("1 三级模式一两级映像象", 55, 2));

        // 二级标题：2 数据库的设计
        chapters.add(new Chapter("2 数据库的设计", 56, 2));

        // 二级标题：3 E-R模型
        chapters.add(new Chapter("3 E-R模型", 57, 2));

        // 二级标题：4 关系代数运算
        chapters.add(new Chapter("4 关系代数运算", 58, 2));

        // 二级标题：5 关系数据库的规范化
        chapters.add(new Chapter("5 关系数据库的规范化", 60, 2));

        // 三级标题：5.1 - 5.4
        chapters.add(new Chapter("5.1 函数依赖", 60, 3));
        chapters.add(new Chapter("5.2 键和约束", 60, 3));
        chapters.add(new Chapter("5.3 范式", 61, 3));
        chapters.add(new Chapter("5.4 模式分解", 63, 3));

        // 二级标题：5.5 并发控制基本概念图
        chapters.add(new Chapter("5.5 并发控制基本概念图", 66, 3));

        // 二级标题：5.6 事务管理
        chapters.add(new Chapter("5.6 事务管理", 66, 3));

        // 二级标题：5.7 封锁协议
        chapters.add(new Chapter("5.7 封锁协议", 67, 3));

        // 二级标题：6 数据故障与备份
        chapters.add(new Chapter("6 数据故障与备份", 69, 2));

        // 三级标题：6.1 - 6.3
        chapters.add(new Chapter("6.1 安全措施", 69, 3));
        chapters.add(new Chapter("6.2 数据故障", 70, 3));
        chapters.add(new Chapter("6.3 数据备份", 70, 3));

        // 二级标题：7 分布式数据库
        chapters.add(new Chapter("7 分布式数据库", 71, 2));

        // 二级标题：8 数据仓库与数据挖掘
        chapters.add(new Chapter("8 数据仓库与数据挖掘", 71, 2));

        // 二级标题：9 反规范化技术
        chapters.add(new Chapter("9 反规范化技术", 73, 2));

        // 二级标题：10 大数据
        chapters.add(new Chapter("10 大数据", 73, 2));

        // 二级标题：11 SQL语言
        chapters.add(new Chapter("11 SQL语言", 74, 2));

        // 一级标题：六 计算机网络
        chapters.add(new Chapter("六 计算机网络", 75, 1));

        // 二级标题：1 网络概述和模型
        chapters.add(new Chapter("1 网络概述和模型", 75, 2));

        // 二级标题：2 传输介质
        chapters.add(new Chapter("2 传输介质", 78, 2));

        // 二级标题：3 通信方式和交换方式
        chapters.add(new Chapter("3 通信方式和交换方式", 81, 2));

        // 二级标题：4 IP地址
        chapters.add(new Chapter("4 IP地址", 82, 2));

        // 三级标题：4.1 - 4.3
        chapters.add(new Chapter("4.1 分类地址格式", 82, 3));
        chapters.add(new Chapter("4.2 子网划分", 84, 3));
        chapters.add(new Chapter("4.3 无分类编址", 85, 3));

        // 二级标题：5 IPv6
        chapters.add(new Chapter("5 IPv6", 85, 2));

        // 二级标题：6 网络规划和设计
        chapters.add(new Chapter("6 网络规划和设计", 86, 2));

        // 三级标题：6.1 - 6.2
        chapters.add(new Chapter("6.1 层次化局域网模型", 86, 3));
        chapters.add(new Chapter("6.2 建筑物综合布线系统PDS", 87, 3));

        // 二级标题：7 网络管理命令
        chapters.add(new Chapter("7 网络管理命令", 87, 2));

        // 二级标题：8 网络存储技术
        chapters.add(new Chapter("8 网络存储技术", 88, 2));

        // 三级标题：8.1 - 8.2
        chapters.add(new Chapter("8.1 廉价磁盘冗余阵列", 88, 3));
        chapters.add(new Chapter("8.2 网络存储", 89, 3));

        // 二级标题：9 其他考点汇总
        chapters.add(new Chapter("9 其他考点汇总", 90, 2));

        // 一级标题：七 安全性知识
        chapters.add(new Chapter("七 安全性知识", 92, 1));

        // 二级标题：1 信息安全和信息系统安全
        chapters.add(new Chapter("1 信息安全和信息系统安全", 92, 2));

        // 二级标题：2 信息安全技术
        chapters.add(new Chapter("2 信息安全技术", 93, 2));

        // 二级标题：3 网络安全技术
        chapters.add(new Chapter("3 网络安全技术", 96, 2));

        // 二级标题：4 网络安全协议
        chapters.add(new Chapter("4 网络安全协议", 98, 2));

        // 一级标题：八 知识产权和标准化
        chapters.add(new Chapter("八 知识产权和标准化", 100, 1));

        // 二级标题：1 知识产权基础知识
        chapters.add(new Chapter("1 知识产权基础知识", 100, 2));

        // 二级标题：2 标准化基础知识
        chapters.add(new Chapter("2 标准化基础知识", 102, 2));

        // 一级标题：九 信息系统基础知识
        chapters.add(new Chapter("九 信息系统基础知识", 103, 1));

        // 二级标题：1 信息化基本概念
        chapters.add(new Chapter("1 信息化基本概念", 103, 2));

        // 三级标题：1.1 - 1.2
        chapters.add(new Chapter("1.1 信息系统概念", 103, 3));
        chapters.add(new Chapter("1.2 信息化战略体系", 106, 3));

        // 二级标题：2 信息系统战略规划
        chapters.add(new Chapter("2 信息系统战略规划", 108, 2));

        // 二级标题：3 政府信息化与电子政务
        chapters.add(new Chapter("3 政府信息化与电子政务", 108, 2));

        // 二级标题：4 企业信息化与电子商务
        chapters.add(new Chapter("4 企业信息化与电子商务", 109, 2));

        // 三级标题：4.1 - 4.9
        chapters.add(new Chapter("4.1 企业资源计划ERP", 110, 3));
        chapters.add(new Chapter("4.2 客户关系管理CRM", 111, 3));
        chapters.add(new Chapter("4.3 供应链管理SCM", 112, 3));
        chapters.add(new Chapter("4.4 产品数据管理PDM", 112, 3));
        chapters.add(new Chapter("4.5 决策支持系统DSS", 113, 3));
        chapters.add(new Chapter("4.6 知识管理", 114, 3));
        chapters.add(new Chapter("4.7 企业门户", 114, 3));
        chapters.add(new Chapter("4.8 企业应用集成EAI", 114, 3));
        chapters.add(new Chapter("4.9 电子商务", 117, 3));

        // 一级标题：十 软件工程基础知识
        chapters.add(new Chapter("十 软件工程基础知识", 118, 1));

        // 二级标题：1 软件工程基础
        chapters.add(new Chapter("1 软件工程基础", 118, 2));
        // 三级标题：1.1 - 1.5
        chapters.add(new Chapter("1.1 能力成熟度模型", 118, 3));
        chapters.add(new Chapter("1.2 软件过程模型", 121, 3));
        chapters.add(new Chapter("1.3 软件开发方法", 122, 3));
        chapters.add(new Chapter("1.4 软件产品线", 126, 3));
        chapters.add(new Chapter("1.5 逆向工程", 126, 3));

        // 二级标题：2 需求工程
        chapters.add(new Chapter("2 需求工程", 127, 2));
        // 三级标题：2.1 - 2.6
        chapters.add(new Chapter("2.1 软件需求", 127, 3));
        chapters.add(new Chapter("2.2 需求获取", 129, 3));
        chapters.add(new Chapter("2.3 需求分析", 129, 3));
        chapters.add(new Chapter("2.4 需求定义", 130, 3));
        chapters.add(new Chapter("2.5 需求验证", 130, 3));
        chapters.add(new Chapter("2.6 需求管理", 131, 3));

        // 二级标题：3 系统设计
        chapters.add(new Chapter("3 系统设计", 132, 2));
        // 三级标题：3.1 - 3.3
        chapters.add(new Chapter("3.1 处理流程设计", 132, 3));
        chapters.add(new Chapter("3.2 系统设计", 133, 3));
        chapters.add(new Chapter("3.3 人机界面设计", 134, 3));

        // 二级标题：4 测试基础知识
        chapters.add(new Chapter("4 测试基础知识", 135, 2));
        // 三级标题：4.1 - 4.4
        chapters.add(new Chapter("4.1 测试基础", 135, 3));
        chapters.add(new Chapter("4.2 测试阶段", 136, 3));
        chapters.add(new Chapter("4.3 测试用例设计", 136, 3));
        chapters.add(new Chapter("4.4 调试", 138, 3));

        // 二级标题：5 系统运行与维护
        chapters.add(new Chapter("5 系统运行与维护", 139, 2));
        // 三级标题：5.1 - 5.3
        chapters.add(new Chapter("5.1 系统转换", 139, 3));
        chapters.add(new Chapter("5.2 系统维护概述", 140, 3));
        chapters.add(new Chapter("5.3 系统评价", 141, 3));

        // 一级标题：十一 项目管理
        chapters.add(new Chapter("十一 项目管理", 141, 1));
        // 二级标题：1 范围管理 - 7 组织结构
        chapters.add(new Chapter("1 范围管理", 141, 2));
        chapters.add(new Chapter("2 进度管理", 143, 2));
        chapters.add(new Chapter("3 成本管理", 145, 2));
        chapters.add(new Chapter("4 软件配置管理", 146, 2));
        chapters.add(new Chapter("5 质量管理", 149, 2));
        chapters.add(new Chapter("6 风险管理", 151, 2));
        chapters.add(new Chapter("7 组织结构", 153, 2));

        // 一级标题：十二 面向对象技术
        chapters.add(new Chapter("十二 面向对象技术", 153, 1));
        // 二级标题：1 面向对象基础
        chapters.add(new Chapter("1 面向对象基础", 153, 2));
        // 二级标题：2 UML
        chapters.add(new Chapter("2 UML", 157, 2));
        // 三级标题：2.1 - 2.3
        chapters.add(new Chapter("2.1 事物", 157, 3));
        chapters.add(new Chapter("2.2 关系", 157, 3));
        chapters.add(new Chapter("2.3 图", 158, 3));

        // 二级标题：3 设计模式
        chapters.add(new Chapter("3 设计模式", 163, 2));

        // 一级标题：十三 软件架构设计
        chapters.add(new Chapter("十三 软件架构设计", 166, 1));
        // 二级标题：1 软件架构的概念
        chapters.add(new Chapter("1 软件架构的概念", 166, 2));
        // 二级标题：2 软件架构风格
        chapters.add(new Chapter("2 软件架构风格", 169, 2));
        // 三级标题：2.1 - 2.3
        chapters.add(new Chapter("2.1 基本架构风格", 169, 3));
        chapters.add(new Chapter("2.2 层次结构风格", 173, 3));
        chapters.add(new Chapter("2.3 面向服务的架构SOA", 176, 3));

        // 二级标题：3 架构描述语言ADL
        chapters.add(new Chapter("3 架构描述语言ADL", 179, 2));
        // 二级标题：4 特定领域软件架构DSSA
        chapters.add(new Chapter("4 特定领域软件架构DSSA", 179, 2));
        // 二级标题：5 基于架构的软件开发方法
        chapters.add(new Chapter("5 基于架构的软件开发方法", 181, 2));
        // 二级标题：6 软件架构评估
        chapters.add(new Chapter("6 软件架构评估", 183, 2));
        // 三级标题：6.1 - 6.3
        chapters.add(new Chapter("6.1 质量属性", 183, 3));
        chapters.add(new Chapter("6.2 架构评估方式", 184, 3));
        chapters.add(new Chapter("6.3 基于场景的评估方式", 185, 3));

        chapters.add(new Chapter("7 中间件技术", 187, 2));
        chapters.add(new Chapter("7.1 典型的应用架构-J2EE", 188, 3));
        chapters.add(new Chapter("7.2 典型的应用架构-.NET", 190, 3));

        chapters.add(new Chapter("8 Web架构设计", 191, 2));
        chapters.add(new Chapter("8.1 Web技术与演变", 191, 3));
        chapters.add(new Chapter("8.2 负载均衡技术", 193, 3));
        chapters.add(new Chapter("8.3 CDN", 195, 3));
        chapters.add(new Chapter("8.4 Web架构", 196, 3));
        chapters.add(new Chapter("8.5 缓存技术", 198, 3));
        chapters.add(new Chapter("8.6 XML和JSON", 199, 3));
        chapters.add(new Chapter("8.7 Web应用服务器", 200, 3));
        chapters.add(new Chapter("8.8 其他", 201, 3));

        // 一级标题：十四 数学与经济管理
        chapters.add(new Chapter("十四 数学与经济管理", 201, 1));
        // 二级标题：1 图论应用
        chapters.add(new Chapter("1 图论应用", 201, 2));
        // 三级标题：1.1 - 1.3
        chapters.add(new Chapter("1.1 最小生成树", 201, 3));
        chapters.add(new Chapter("1.2 最短路径", 201, 3));
        chapters.add(new Chapter("1.3 网络与最大流量", 202, 3));

        // 二级标题：2 运筹方法
        chapters.add(new Chapter("2 运筹方法", 202, 2));
        // 三级标题：2.1 - 2.7
        chapters.add(new Chapter("2.1 线性规划", 202, 3));
        chapters.add(new Chapter("2.2 动态规划", 202, 3));
        chapters.add(new Chapter("2.3 伏格尔法", 203, 3));
        chapters.add(new Chapter("2.4 博弈论", 203, 3));
        chapters.add(new Chapter("2.5 状态转移矩阵", 204, 3));
        chapters.add(new Chapter("2.6 排队论", 204, 3));
        chapters.add(new Chapter("2.7 决策论", 204, 3));

        // 二级标题：3 数学建模
        chapters.add(new Chapter("3 数学建模", 205, 2));
        return chapters;
    }

    /**
     * 构建多级书签树
     */
    private static PDOutlineItem buildOutlineTree(List<Chapter> chapters, PDDocument document) throws Exception {
        PDOutlineItem root = new PDOutlineItem();
        root.setTitle("系统大成");

        // 用于记录当前层级的父节点
        Stack<PDOutlineItem> stack = new Stack<>();
        stack.push(root);

        for (Chapter chapter : chapters) {
            PDOutlineItem item = new PDOutlineItem();
            item.setTitle(chapter.title);

            int pageIndex = chapter.pageNumber - 1;
            if (pageIndex >= 0 && pageIndex < document.getNumberOfPages()) {
                item.setDestination(document.getPage(pageIndex));
            }

            // 如果当前层级小于等于栈顶层级，则弹出
            while (stack.size() > chapter.level) {
                stack.pop();
            }

            // 当前层级为上一层的子节点
            stack.peek().addLast(item);

            // 当前节点入栈，作为后续子节点的父节点
            stack.push(item);
        }

        return root;
    }
}